#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
MUD客户端主窗口界面模块
负责创建和管理客户端的用户界面
"""

import logging
import re
from typing import Optional
from prompt_toolkit import Application
from prompt_toolkit.buffer import Buffer
from prompt_toolkit.document import Document
from prompt_toolkit.layout.containers import (
    HSplit, VSplit, Window, WindowAlign
)
from prompt_toolkit.layout.controls import FormattedTextControl
from prompt_toolkit.layout import Layout
from prompt_toolkit.application import get_app
from prompt_toolkit.widgets import TextArea
from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.layout.dimension import Dimension
from prompt_toolkit.formatted_text import to_formatted_text
from prompt_toolkit.data_structures import Point
from .styles import STYLE
from prompt_toolkit import Application
from .ansi_widgets import AnsiTextArea

class MainWindow:
    """
    MUD客户端主窗口
    负责创建和管理客户端的用户界面
    """
    
    def __init__(self):
        """
        初始化主窗口
        """
        self.logger = logging.getLogger(__name__)
        self.input_callback = None
        
        # 创建键盘绑定
        self.key_bindings = KeyBindings()
        
        # 初始化按键绑定
        self._init_key_bindings()
        
        # 创建UI控件
        self._create_ui_controls()
        
        # 创建主布局
        self._create_layout()
                
        # 创建应用程序，启用满屏显示和键盘绑定
        self.app: Optional[Application] = Application(
            layout=self.layout,
            style=STYLE,
            full_screen=True,
            mouse_support=True,
            key_bindings=self.key_bindings
        )
        
        # 欢迎文本
        welcom_text = """

                   欢迎使用 MUD 客户端                        

  系统指令说明:                                               
    #con [host] [port] [encoding]  - 连接到指定服务器         
         默认连接: mud.pkuxkx.net 8081 utf8                   
    #send <data>                   - 发送原始数据到服务器     
    #quit 或 #exit                 - 退出程序                 

  游戏指令:                                                   
    其他所有指令将作为游戏命令发送到服务器                    

  快捷键:                                                     
    Ctrl+C                         - 退出程序                 
    Ctrl+T                         - 切换游戏输出自动滚动     
    ↑/↓                            - 查看命令历史             

"""
        self.append_game_output(welcom_text)
    
    def _init_key_bindings(self):
        """
        初始化按键绑定
        """
        # 绑定Ctrl+C关闭窗口
        @self.key_bindings.add('c-c')
        def _(event):
            """
            Ctrl+C关闭窗口处理函数
            """
            self.exit()
            
        # 绑定Ctrl+T切换游戏输出窗口的自动滚动
        @self.key_bindings.add('c-t')
        def _(event):
            """
            Ctrl+T切换游戏输出窗口的自动滚动
            """
            self.game_output_window.auto_scroll_bottom = not self.game_output_window.auto_scroll_bottom
            status = "自动滚动已启用" if self.game_output_window.auto_scroll_bottom else "自动滚动已禁用"
            self.set_status(f"游戏输出窗口{status}")

    def _create_ui_controls(self):
        """
        创建UI控件
        """
        # 创建标题栏控件，文字居中显示
        self.title_control = FormattedTextControl(
            text=[('', 'MUD客户端'.center(50))]  # 居中显示标题
        )

        # 创建缓冲区并设置默认值，设置为只读模式
        # self.game_buffer = Buffer(multiline=True)
        # self.system_buffer = Buffer(multiline=True)
        
        # 创建游戏输出窗口（使用自定义控件）
        self.game_output_window = AnsiTextArea(
            auto_scroll_bottom=True, 
            width=Dimension(weight=4),
            multiline=True,
            wrap_lines=False,
            scrollbar=True,
            focus_on_click=True,
        )
        
        # 创建系统输出窗口（使用自定义控件）
        self.system_output_window = TextArea(
            width=Dimension(weight=6),
            multiline=True,
            wrap_lines=False,
            scrollbar=True,
            focus_on_click=True,
        )
        
        # 创建命令行输入控件，启用历史命令和自动完成功能
        self.command_input = TextArea(
            prompt='> ',
            multiline=False,
            wrap_lines=True,
            height=1,
            auto_suggest=AutoSuggestFromHistory(),
            focus_on_click=True,  # 确保命令行可以获取焦点
            accept_handler=self._handle_user_input  # 添加用户输入处理函数
        )
        
        # 创建状态栏控件
        self.status_control = Window(
            content=FormattedTextControl(text="就绪"),
            height=1,
            style='class:status'
        )
    
    def _create_layout(self):
        """
        创建主布局
        
        Returns:
            HSplit: 根容器
        """
        # 创建左右分屏输出窗口 (4:6比例)
        self.output_window = VSplit([
            self.game_output_window,
            Window(width=1, char='│', style='class:separator'),
            self.system_output_window
        ])
        
        # 创建主布局
        self.root_container = HSplit([
            Window(content=self.title_control, height=1, style='class:title', align=WindowAlign.CENTER),
            Window(height=1, char='─', style='class:separator'),
            self.output_window,
            Window(height=1, char='─', style='class:separator'),
            self.command_input,
            Window(height=1, char='─', style='class:separator'),
            self.status_control,
        ])
        
        self.layout = Layout(self.root_container,focused_element=self.command_input.buffer)

    
    def _handle_user_input(self, buffer):
        """
        处理用户输入
        
        数据流处理规范：
        1. UI捕获输入：UI层捕获用户输入并通过回调传递给CommandHandler
        2. 命令处理：CommandHandler解析命令并调用MUDClient的send_command()方法
        3. 客户端转发：MUDClient调用Session的send_data()方法发送数据
        
        Args:
            buffer (Buffer): 命令行输入缓冲区
        """
        user_input = buffer.text.strip()
        if user_input:
            # 将输入添加到历史记录中
            buffer.append_to_history()
            
            # 使用回调函数方式处理输入
            if self.input_callback:
                self.input_callback(user_input)
            else:
                self.logger.warning("没有设置输入回调函数")
            
            # 清空输入框
            buffer.reset()
        
        return True
    
    def append_game_output(self, text: str):
        """
        向游戏输出缓冲区添加文本
        
        Args:
            text (str): 要添加的文本
        """
        # 设置为可写模式
        self.game_output_window.append_text(text)

    def append_system_output(self, text: str):
        """
        向系统输出缓冲区添加文本
        
        Args:
            text (str): 要添加的文本
        """
        current_text = self.system_output_window.text
        new_text = current_text + text
        new_document = Document(new_text, len(new_text))
        self.system_output_window.document = new_document
    
    def set_status(self, text: str):
        """
        设置状态栏文本
        
        Args:
            text (str): 状态文本
        """
        self._status_text = text
        # 暂时直接更新状态栏控件
        self.status_control.content = FormattedTextControl(text=text)
        if self.app:
            self.app.invalidate()
    
    def set_input_callback(self, callback):
        """
        设置用户输入回调函数
        
        Args:
            callback (function): 用户输入处理回调函数
        """
        self.input_callback = callback
    
    async def run_async(self):
        """
        异步运行主窗口
        """
        if self.app:
            await self.app.run_async()
    
    def exit(self):
        """
        退出应用程序
        """
        if self.app:
            try:
                self.app.exit()
            except Exception as e:
                self.logger.warning(f"退出应用时出现异常: {e}")
    
    def _scroll_to_bottom(self, buffer):
        """
        滚动缓冲区到底部
        
        Args:
            buffer (Buffer): 要滚动的缓冲区
        """
        # 将光标位置设置为文本末尾
        buffer.cursor_position = len(buffer.text)
